#include <asm/cprefix.h>

	.text
	.align 4
	.global C_LABEL(__memcmp), C_LABEL(memcmp)
C_LABEL(__memcmp):
C_LABEL(memcmp):
#if 1
	cmp	%o2, 0
	ble	L3
	 mov	0, %g3
L5:
	ldub	[%o0], %g2
	ldub	[%o1], %g3
	sub	%g2, %g3, %g2
	mov	%g2, %g3
	sll	%g2, 24, %g2

	cmp	%g2, 0
	bne	L3
	 add	%o0, 1, %o0

	add	%o2, -1, %o2

	cmp	%o2, 0
	bg	L5
	 add	%o1, 1, %o1
L3:
	sll	%g3, 24, %o0
	sra	%o0, 24, %o0

	retl
	 nop
#else
	save	%sp, -104, %sp
	mov	%i2, %o4
	mov	%i0, %o0

	cmp	%o4, 15
	ble	L72
	 mov	%i1, %i2

	andcc	%i2, 3, %g0
	be	L161
	 andcc	%o0, 3, %g2
L75:
	ldub	[%o0], %g3
	ldub	[%i2], %g2
	add	%o0,1, %o0

	subcc	%g3, %g2, %i0
	bne	L156
	 add	%i2, 1, %i2

	andcc	%i2, 3, %g0
	bne	L75
	 add	%o4, -1, %o4

	andcc	%o0, 3, %g2
L161:
	bne,a	L78
	 mov	%i2, %i1

	mov	%o0, %i5
	mov	%i2, %i3
	srl	%o4, 2, %i4

	cmp	%i4, 0
	bge	L93
	 mov	%i4, %g2

	add %i4, 3, %g2
L93:
	sra	%g2, 2, %g2
	sll	%g2, 2, %g2
	sub	%i4, %g2, %g2

	cmp	%g2, 1
	be,a	L88
	 add	%o0, 4, %i5

	bg	L94
	 cmp	%g2, 2

	cmp	%g2, 0
	be,a	L86
	 ld	[%o0], %g3

	b	L162
	 ld	[%i5], %g3
L94:
	be	L81
	 cmp	%g2, 3

	be,a	L83
	 add	%o0, -4, %i5

	b	L162
	 ld	[%i5], %g3
L81:
	add	%o0, -8, %i5
	ld	[%o0], %g3
	add	%i2, -8, %i3
	ld	[%i2], %g2

	b	L82
	 add	%i4, 2, %i4
L83:
	ld	[%o0], %g4
	add	%i2, -4, %i3
	ld	[%i2], %g1

	b	L84
	 add	%i4, 1, %i4
L86:
	b	L87
	 ld	[%i2], %g2
L88:
	add	%i2, 4, %i3
	ld	[%o0], %g4
	add	%i4, -1, %i4
	ld	[%i2], %g1
L95:
	ld	[%i5], %g3
L162:
	cmp	%g4, %g1
	be	L87
	 ld	[%i3], %g2

	cmp	%g4, %g1
L163:
	bleu	L114
	 mov	-1, %i0

	b	L114
	 mov	1, %i0
L87:
	ld	[%i5 + 4], %g4
	cmp	%g3, %g2
	bne	L163
	 ld	[%i3 + 4], %g1
L84:
	ld	[%i5 + 8], %g3

	cmp	%g4, %g1
	bne	L163
	 ld	[%i3 + 8], %g2
L82:
	ld	[%i5 + 12], %g4
	cmp	%g3, %g2
	bne	L163
	 ld	[%i3 + 12], %g1

	add	%i5, 16, %i5

	addcc	%i4, -4, %i4
	bne	L95
	 add	%i3, 16, %i3

	cmp	%g4, %g1
	bne	L163
	 nop

	b	L114
	 mov	0, %i0
L78:
	srl	%o4, 2, %i0
	and	%o0, -4, %i3
	orcc	%i0, %g0, %g3
	sll	%g2, 3, %o7
	mov	32, %g2

	bge	L129
	 sub	%g2, %o7, %o1

	add	%i0, 3, %g3
L129:
	sra	%g3, 2, %g2
	sll	%g2, 2, %g2
	sub	%i0, %g2, %g2

	cmp	%g2, 1
	be,a	L124
	 ld	[%i3], %o3

	bg	L130
	 cmp	%g2, 2

	cmp	%g2, 0
	be,a	L122
	 ld	[%i3], %o2

	b	L164
	sll	%o3, %o7, %g3
L130:
	be	L117
	 cmp	%g2, 3

	be,a	L119
	 ld	[%i3], %g1

	b	L164
	 sll	%o3, %o7, %g3
L117:
	ld	[%i3], %g4
	add	%i2, -8, %i1
	ld	[%i3 + 4], %o3
	add	%i0, 2, %i0
	ld	[%i2], %i4

	b	L118
	 add	%i3, -4, %i3
L119:
	ld	[%i3 + 4], %g4
	add	%i2, -4, %i1
	ld	[%i2], %i5

	b	L120
	 add	%i0, 1, %i0
L122:
	ld	[%i3 + 4], %g1
	ld	[%i2], %i4

	b	L123
	 add	%i3, 4, %i3
L124:
	add	%i2, 4, %i1
	ld	[%i3 + 4], %o2
	add	%i0, -1, %i0
	ld	[%i2], %i5
	add	%i3, 8, %i3
L131:
	sll	%o3, %o7, %g3
L164:
	srl	%o2, %o1, %g2
	ld	[%i3], %g1
	or	%g3, %g2, %g3

	cmp	%g3, %i5
	bne	L163
	 ld	[%i1], %i4
L123:
	sll	%o2, %o7, %g3
	srl	%g1, %o1, %g2
	ld	[%i3 + 4], %g4
	or	%g3, %g2, %g3

	cmp	%g3, %i4
	bne	L163
	 ld	[%i1 + 4], %i5
L120:
	sll	%g1, %o7, %g3
	srl	%g4, %o1, %g2
	ld	[%i3 + 8], %o3
	or	%g3, %g2, %g3

	cmp	%g3, %i5
	bne	L163
	 ld	[%i1 + 8], %i4
L118:
	sll	%g4, %o7, %g3
	srl	%o3, %o1, %g2
	ld	[%i3 + 12], %o2
	or	%g3, %g2, %g3

	cmp	%g3, %i4
	bne	L163
	 ld	[%i1 + 12], %i5

	add	%i3, 16, %i3
	addcc	%i0, -4, %i0
	bne	L131
	 add	%i1, 16, %i1

	sll	%o3, %o7, %g3
	srl	%o2, %o1, %g2
	or	%g3, %g2, %g3

	cmp	%g3, %i5
	be,a	L114
	 mov	0, %i0

	b,a L163
L114:
	cmp	%i0, 0
	bne	L156
	 and	%o4, -4, %g2

	add	%o0, %g2, %o0
	add	%i2, %g2, %i2
	and	%o4, 3, %o4
L72:
	cmp	%o4, 0
	be	L156
	 mov	0, %i0

	ldub	[%o0], %g3
L165:
	ldub	[%i2], %g2
	add	%o0, 1, %o0

	subcc	%g3, %g2, %i0
	bne	L156
	 add	%i2, 1, %i2

	addcc	%o4, -1, %o4
	bne,a	L165
	 ldub	[%o0], %g3

	mov	0, %i0
L156:
	ret
	restore
#endif
